/*
 * Cliente.cpp
 *
 *  Created on: 20/08/2012
 *      Author: AndreBonfatti
 */

#include "Cliente.h"
#include <cstdlib>

using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
using std::istream;
using std::atoi;

Cliente::Cliente(string n, string cpf){
	nome = n;
	CPF = cpf;
	quant = 0;
}

Cliente::Cliente(){
}

void Cliente::alterarCliente(string n, string cpf){
	nome = n;
	CPF = cpf;
}

string Cliente::getNome(){
	return nome;
}

string Cliente::getCPF(){
	return CPF;
}

void Cliente::setNome(string n){
	nome = n;
}

void Cliente::setCPF(string cpf){
	CPF = cpf;
}

//retorna um paciente dado um código como parametro
Paciente Cliente::getPacienteByCodigo(int cod){
    int achou = 0;
    list<Paciente>::iterator i;
    while (achou == 0){
    	i = pacientes.begin();
        while (i != pacientes.end()){
            if (cod == (*i).getCodigo()){
                achou = 1;
                break;
            }
            cout << (*i).getCodigo() << " - " << (*i).getNome() << endl;
            i++;
        }
    }
    return (*i);
}

//verifica se cpf é valido
bool Cliente::cpfValido(string cpf){
    string s = cpf;
    unsigned lenght = 0;
    int ver1 = 0, ver2 = 0, j;
    char aux;

    while (s[lenght]) {
        lenght++;
    }

    if (lenght != 11)
        return false;

    for (j = 0; j < 9; j++){
        aux = s[j];
        ver1 += atoi(&aux)*(j+1);
    }

    ver1 %= 11;

    for (j = 0; j < 9; j++){
        aux = s[j];
        ver2 += atoi(&aux)*j;
    }

    ver2 += ver1*9;
    ver2 %= 11;

    aux = s[lenght-2];
    if (atoi(&aux) == ver1){
        aux = s[lenght-1];
        if ( atoi(&aux) == ver2)
            return true;
    }
    return false;
}

//adiciona Paciente
void Cliente::adicionarPaciente(string nome, Data dataNasc){
    pacientes.push_front(Paciente(nome, dataNasc));
    quant++;
}

//Imprime sub-menu de escolha de paciente
Paciente Cliente::getPaciente(){
    list<Paciente>::iterator iter = pacientes.begin();
    int i = 1, d;
    while (iter != pacientes.end()){
        cout << i << " - " << (*iter).getNome() << " (" << (*iter).getCodigo() << ") " << endl;
        iter++;
    }
    cout << endl << "Informe o digito do paciente desejado" << endl;
    cin >> d;
    while (d > i || d < 0){
        cout << "Digito incorreto" << endl;
        cout << endl << "Informe o digito do paciente desejado" << endl;
        cin >> d;
    }
    iter = pacientes.begin();
    for (i = 1; i < d; i++)
        iter++;
    return (*iter);
}

//Mostra dados do cliente e seus pacientes associados
void Cliente::consultarCliente(){
	cout << endl;
	cout << "Cliente:" << endl;
	cout << "\tNome\t- " << nome << endl;
	cout << "\tCPF\t- " << CPF << endl;
    cout << "Pacientes Associados:" << endl << endl;

    listarPacientes();
    
    cout << endl;
}

void Cliente::selecionarPaciente(Paciente p){
    (*iPaciente) = Paciente(p);
}

list<Paciente> Cliente::getListPaciente(){
    return pacientes;
}

/*sobrecarga do operador de fluxo << - cout*/
ostream &operator<<(ostream &o, Cliente &c){
		o << c.quant << endl;
        o << c.nome << endl;
        o << c.CPF << endl << endl;

        list<Paciente> :: iterator i = c.pacientes.begin();

           /*escreve o nome de todos os pacientes associados*/
           while (i != c.pacientes.end()){
        	   o << *i;
               i++;
           }

        return o;

}

list<Paciente>::iterator Cliente::getPacienteSelecionado(){
    return iPaciente;
}

void Cliente::excluirPaciente(){
    pacientes.erase(iPaciente);
    iPaciente = pacientes.end();
}

/*sobrecarga do operador de fluxo >> - cin*/
istream &operator>>(istream &in, Cliente &c){
    in >> c.quant;
	in >> c.nome;
    in >> c.CPF;
    int auxiliarContador = c.quant;
    int dia, mes, ano;
    int codigo;
    string n;
    unsigned int numCarteira;
    //int quantidade;
	//carteira e agenda
	while(auxiliarContador){
		in >> codigo;
		in.ignore();
		in >> n;
		in.ignore();
		in >> dia;
		in.ignore(1);
		in >> mes;
		in.ignore(1);
		in >> ano;
		in.ignore();
		in >> numCarteira;
		//in >> quantidade;
		Data dat(dia, mes, ano);
		c.adicionarPaciente(n, dat);
		//ag.itens.push_back(auxiliarItemAgenda);
		auxiliarContador--;
		in.ignore();
		in.ignore();
    	}


    return in;

}


void Cliente::listarPacientes(){
    list<Paciente>::iterator i;

    i = pacientes.begin();
    /*escreve o nome de todos os pacientes associados*/
    while (i != pacientes.end()){
        (*i).consultarPaciente();
        i++;
    }
}


/*Sobrecarga operador de igualdade*/
bool Cliente::operator==(const Cliente &c){

        if (CPF == c.CPF)
                return true;
        return false;
}

/*Sobrecarga operador de desigualdade*/
bool Cliente::operator!=(const Cliente &c){

        if (CPF != c.CPF)
                return true;
        return false;
}

Cliente::~Cliente(){}
